﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model.Produtos;

namespace welwitschia.Produtos
{
    public partial class FamiliaProduto : PaginaBase
    {
        private Dictionary<String, TreeNode> _idxTreeView = new Dictionary<string, TreeNode>();
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                GrupoProduto grupoProdutoPai = null;
                String codFamilia = String.Empty;
                IGrupoProdutoService grupoProdutoService = new GrupoProdutoService();
                if (!String.IsNullOrEmpty(Request.QueryString["codgpp"]))
                {
                    grupoProdutoPai = grupoProdutoService.ObterPorCodGrupoProduto(Request.QueryString["codgpp"]);
                    codFamilia = grupoProdutoPai.CodGrupoProduto;
                    txtFamiliaPai.Text = grupoProdutoPai.Nome;
                    hfModo.Value = "Novo";
                }
                else if (!String.IsNullOrEmpty(Request.QueryString["codgp"]))
                {
                    BindData(Request.QueryString["codgp"]);
                    codFamilia = txtCodGrupoProduto.Text;
                    hfModo.Value = "Edicao";
                }
                else
                {
                    LimpaDadosForm();
                    hfModo.Value = "Novo";
                }

                BindTreeViewFamilias(codFamilia);
            }
        }

        private void BindTreeViewFamilias(String codFamilia)
        {
            GrupoProdutoService grupoProdutoService = new GrupoProdutoService();
            IList<GrupoProduto> gruposProdutos = grupoProdutoService.ObterTodos();

            IEnumerable<GrupoProduto> found = gruposProdutos.Where<GrupoProduto>(e => e.GrupoPai == null);
            foreach (GrupoProduto gp in found)
            {
                AddNode(gp, codFamilia);
            }

            found = gruposProdutos.Where<GrupoProduto>(e => e.GrupoPai != null);
            foreach (GrupoProduto gp in found)
            {
                AddNode(gp, codFamilia);
            }
        }


        private void AddNode(GrupoProduto grupoProduto, String codFamilia)
        {
            TreeNode node = new TreeNode();
            node.Text = grupoProduto.Nome;
            node.Value = grupoProduto.CodGrupoProduto;
            if (!String.IsNullOrEmpty(codFamilia))
            {
                if (codFamilia == grupoProduto.CodGrupoProduto)
                    node.Select();
            }
            _idxTreeView.Add(grupoProduto.CodGrupoProduto, node);

            if (grupoProduto.GrupoPai != null)
            {
                TreeNode nodePai = _idxTreeView[grupoProduto.GrupoPai.CodGrupoProduto];
                nodePai.ChildNodes.Add(node);
            }
            else
            {
                tvFamilias.Nodes.Add(node);
            }
        }

        protected void tvFamilias_SelectedNodeChanged(object sender, EventArgs e)
        {
            if (hfModo.Value == "Novo")
            {
                txtFamiliaPai.Text = tvFamilias.SelectedNode.Text;
            }
            else
            {
                BindData(tvFamilias.SelectedValue);
            }
        }

        private void BindData(String codGrupoProduto)
        {
            GrupoProdutoService grupoProdutoService = new GrupoProdutoService();
            GrupoProduto grupoProduto = grupoProdutoService.ObterPorCodGrupoProduto(codGrupoProduto);
            txtCodGrupoProduto.Text = grupoProduto.CodGrupoProduto;
            txtNome.Text = grupoProduto.Nome;
            txtDescricao.Text = grupoProduto.Descricao;
            if (grupoProduto.GrupoPai != null)
                txtFamiliaPai.Text = grupoProduto.GrupoPai.Nome;
            else
                txtFamiliaPai.Text = String.Empty;
        }


        private void LimpaDadosForm()
        {
            txtCodGrupoProduto.Text = String.Empty;
            txtNome.Text = String.Empty;
            txtDescricao.Text = String.Empty;
        }

        protected void btnGravar_Click(object sender, EventArgs e)
        {
            try
            {
                GrupoProdutoService grupoProdutoService = new GrupoProdutoService();
                GrupoProduto grupoProduto = new GrupoProduto();
                grupoProduto.CodGrupoProduto = txtCodGrupoProduto.Text.Trim();
                grupoProduto.Nome = txtNome.Text.Trim();
                grupoProduto.Descricao = txtDescricao.Text.Trim();
                if (!String.IsNullOrEmpty(txtFamiliaPai.Text))
                    grupoProduto.GrupoPai = new GrupoProduto() { CodGrupoProduto = tvFamilias.SelectedValue };

                if (hfModo.Value == "Novo")
                    grupoProdutoService.Insere(grupoProduto);
                else
                    grupoProdutoService.Actualiza(grupoProduto);

                Response.Redirect(@"~\Produtos\GrupoProdutoLista.aspx");
            }
            catch (Exception ex)
            {
                MostraErro(ex.Message);
            }
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Produtos\GrupoProdutoLista.aspx");
        }

    }
}